Nous allons continuer notre partie de “Domotique DIY” avec la transformation d’une lampe extérieur avec détecteur de mouvement. Le but est bien-sur de la gérer dans notre système domotique.
Présentation.
Je choisie une lampe extérieur doté d’un chargeur solaire, d’un détecteur de mouvement PIR intégré et d’une photorésistance qui l’allume automatiquement une fois Eclairage inférieur à 10 Lux
Pendant sa phase de fonctionnement (>10 Lux) les LEDs intégrées éclairent à 10 lumens, une fois le mouvement détecté éclairage passe a 60 lm.
Caractéristiques:
- Panneau solaire: 0.44W
- Batterie: 3.7V 600 mAH
- Led: 0.5 W, 60 lm
- Angle de détection: 120°, 3m
- Night sensor: < 10 LUX
Pourquoi ce choix ?…..
Pour des raisons d’une installation simple et surtout sans fil pas de perçage 😉
Modification désirées:
Je veux pouvoir allumer et éteindre ma lampe via ma domotique en fonction de différents scénarios. Pour cela je vais me servir de ESP8266 comme interrupteur WiFi.
Un peu de calcule.
Consommation (mA) des LEDs:
Soit P=UI alors I=P/U Ouhaaaaaaaaaaaaa…. je suis fort 😉
1 2 3 | I(LED) = 0.5W / 3.7V I(LED) = 0.14A I(LED) = 140 mA |
I(LED) = 0.5W / 3.7V I(LED) = 0.14A I(LED) = 140 mA
Estimation théorique de duré de la capacité Q:
Soit Q(mAH) = t(H) * I(mA) alors t = Q/I
1 2 | t(batterie) = 600 mAH / 140 mA t(batterie) = 4.3 Heures |
t(batterie) = 600 mAH / 140 mA t(batterie) = 4.3 Heures
Beuuuu, ce n’est pas géniale ça, la lampe ne fonctionnera pas pendant toute la nuit. En plus si nous branchons un ESP8266 qui fonctionne 24h sur 24 cela va réduire encore plus sa longévité.
Calculons le besoins de notre ESP, qui consomme de l’énergie pendant toute la duré de la nuit (>10 LUX).
Sachant que un ESP consomme environ 170 mA avec le Wifi activé et que la batterie se recharge seulement pendant environ 12 heures.
1 2 | Q = 12 * 170 Q = 2040 mAH |
Q = 12 * 170 Q = 2040 mAH
Nous avons besoins alors d’une batterie de min 2040 mAH.
Matérielles:
- Une Lampe (6€)
- ESP 8266 (2€)
- Batterie 3.7V 2450 mAH (4€)
J’ai remplacé la batterie d’origine par une Batterie trouvée sur un des nombreux site Chinois. La lampe et l’ESP viennent naturellement de même site. Coût total de projet est d’environ 12 €.
Démontage
Apres le démontage de la lampe il faut repérer la source d’alimentation et la changer par notre nouvelle batterie
puis souder deux fils à l’interrupteur existant.
Il nous reste plus qu’a brancher notre ESP selon le chemin suivant:
ESP8266 | Lampe |
---|---|
Vcc | Vcc |
CH_PD | Vcc |
GND | GND |
GND | Inter - |
GPIO2 | Inter + |
Programmation de l’ESP8266:
Le programme n’est pas bien compliqué, L’interrupteur étant un bouton poussoir monostable pour allumer ou éteindre la lampe il faudra juste de mettre le GPIO 2 de notre ESP a 1 attendre quelques millisecondes et le basculer a 0. Il faut également définir une variable globale qui va mémoriser l’état a l’instant t de notre interrupteur.
Le code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | /* * This sketch demonstrates how to set up a simple HTTP-like server. * The server will set a GPIO pin depending on the request * http://server_ip/gpio/0 On or Off, * server_ip is the IP address of the ESP8266 module, will be * printed to Serial when the module is connected. * Modified by RSyrek for Domotique-Home.fr */ #include <ESP8266WiFi.h> const char* ssid = "ssid_wifi"; const char* password = "password_wifi"; // Create an instance of the server // specify the port to listen on as an argument WiFiServer server(80); int val = 0; void setup() { Serial.begin(115200); delay(10); // prepare GPIO2 pinMode(2, OUTPUT); digitalWrite(2, 0); delay(500); digitalWrite(2, 1); delay(500); digitalWrite(2, 0); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.println(WiFi.localIP()); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // Match the request if (req.indexOf("/gpio/0") != -1){ digitalWrite(2, 1); delay(500); digitalWrite(2, 0); if(val == 0){ val = 1; } else{ val = 0; } } else { Serial.println("invalid request"); client.stop(); return; } client.flush(); // Prepare the response String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n"; s += val; s += "</html>\n"; // Send the response to the client client.print(s); delay(1); Serial.println("Client disonnected"); // The client will actually be disconnected // when the function returns and 'client' object is detroyed } |
/* * This sketch demonstrates how to set up a simple HTTP-like server. * The server will set a GPIO pin depending on the request * http://server_ip/gpio/0 On or Off, * server_ip is the IP address of the ESP8266 module, will be * printed to Serial when the module is connected. * Modified by RSyrek for Domotique-Home.fr */ #include <ESP8266WiFi.h> const char* ssid = "ssid_wifi"; const char* password = "password_wifi"; // Create an instance of the server // specify the port to listen on as an argument WiFiServer server(80); int val = 0; void setup() { Serial.begin(115200); delay(10); // prepare GPIO2 pinMode(2, OUTPUT); digitalWrite(2, 0); delay(500); digitalWrite(2, 1); delay(500); digitalWrite(2, 0); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.println(WiFi.localIP()); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // Match the request if (req.indexOf("/gpio/0") != -1){ digitalWrite(2, 1); delay(500); digitalWrite(2, 0); if(val == 0){ val = 1; } else{ val = 0; } } else { Serial.println("invalid request"); client.stop(); return; } client.flush(); // Prepare the response String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n"; s += val; s += "</html>\n"; // Send the response to the client client.print(s); delay(1); Serial.println("Client disonnected"); // The client will actually be disconnected // when the function returns and 'client' object is detroyed }
Copier le code suivant dans votre ESP mais avant n’oublier pas de renseigner le SSID et le Mot De Passe de votre connexion Wifi. Une fois connecté, lancez la serial console (Arduino ou Putty) et noter bien l’adresse IP attribué a votre module. Maintenant il suffit de taper URL suivante pour allumer ou éteindre votre lampe.
1 | http://server_ip/gpio/0 |
http://server_ip/gpio/0
Intégration dans Jeedom
Pour gérer notre lampe avec Jeedom nous allons utiliser le Plugin Script. L’Intégration et très facile, suivez le guide:
- Plugin > Programmation > Script
- Ajouter > Nom de l’équipement > D’accord
- Commandes > Nom > OnOff (par exemple)
- Commandes > Type script > HTTP
- Commandes > Type > Action
- Commandes > Requête > IP_ESP8266/gpio/0
Intégration dans HC2
Utilisation de votre lampe avec votre HC2 est aussi simple pour cela vous devez:
- créer un nouveau module virtuel
- insérer un bouton
- coller le code LUA suivant
1 2 3 4 5 6 7 | --[[ %% properties %% globals --]] local http = net.HTTPClient(); http:request("http://IP_ESP8266/gpio/0"); |
--[[ %% properties %% globals --]] local http = net.HTTPClient(); http:request("http://IP_ESP8266/gpio/0");
Vous pouvez bien sur gérer l’état de la lampe, pour cela il faut juste ajouter une condition en fonction de retour, 0 éteint et 1 allumé.
Si vous avez une trop grande tension à la sortie de votre batterie rajouter un régulateur 3.3V ou un pont diviseur de tension.
Si vous avez des questions ou suggestions n’hésitez pas de les poster je vous répondrais avec plaisir.
Bonjour,
C’est un peu ce que je cherche à fabriquer.
Mon but est de renvoyer l’état de la lampe à mon serveur.
Est-ce que le détecteur PIR fonctionne encore après cette modification ?
Oui il fonctionne 😉
Bonjour,
Merci pour ce tuto c’est ce que je cherche à faire.
Est ce que vous savez comment réagira la lampe avec le scénario suivant :
1/ Je souhaite allumer ma lampe de manière constante entre 20:00 et 22:00
2/ Il y a une détection à 20:30
3/ La lampe va t’elle s’éteindre à la fin de la détection ou rester allumée jusqu’a ce que je lui dise de s’éteindre ?
Autre question, est il possible de récupérer le status du détecteur via l’ESP8266 afin d’avoir un scénario plus “complexe” ?
Ci-dessous le fonctionnement que je souhaiterais avoir :
1/ Récuper les infos du capteur de mouvement via l’ESP8266
2/ Pouvoir faire du on/off indépendemment du capteur de mouvement
3/ Allumer/Eteindre si détection
Le but serait que ce soit “ma domotique” qui gère entièrement la lampe.
En gros, je souhaiterais activer la détection suivant des plages horaires.
Pouvoir à l’occasion forcer l’allumage des lampes.
Récupérer n’importe quand le status du capteur.
Merci d’avance,
Mikael
Bonjour,
ESP fait office d’interrupteur c’est possible avec un scénario approprié géré par votre box domotique.
pour la récupération d’info sans modifier le montage vous pouvez utiliser une variable dans votre box mais cela ne sera pas fiable à 100%.